package com.songyuesheng.app.util;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanInstantiationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class BeanCopyUtils {
    private static final Logger log = LoggerFactory.getLogger(BeanCopyUtils.class);

    private BeanCopyUtils() {
        throw new AssertionError("工具类不允许实例化");
    }

    /**
     * 对象属性拷贝（适合对象->对象转换）
     * @param source 源对象（必须是非String的JavaBean）
     * @param clazz 目标类
     * @return 拷贝后的新对象
     */
    public static <T> T copyBean(Object source, Class<T> clazz) {
        if (source == null) return null;

        try {
            T target = clazz.getDeclaredConstructor().newInstance();
            BeanUtils.copyProperties(source, target);
            return target;
        } catch (BeanInstantiationException e) {
            log.error("对象实例化失败，请检查目标类 {} 是否具有无参构造器", clazz.getName(), e);
            throw new RuntimeException("对象拷贝失败：目标类缺少无参构造器");
        } catch (Exception e) {
            log.warn("属性拷贝异常，源类型：{}，目标类型：{}",
                    source.getClass().getName(), clazz.getName(), e);
            return null;
        }
    }

    /**
     * 集合拷贝（适合集合元素转换）
     * @param sourceList 源集合
     * @param targetClass 目标元素类型
     * @return 拷贝后的新集合（可能为空但不会为null）
     */
    public static <S, T> List<T> copyBeanList(List<S> sourceList, Class<T> targetClass) {
        if (sourceList == null || sourceList.isEmpty()) {
            return Collections.emptyList();
        }

        return sourceList.stream()
                .map(source -> copyBean(source, targetClass))
                .collect(Collectors.toList());
    }
}